package routers

import (
	"html/template"
	"net/http"
	"speechsoundsalarm/controller"
	"speechsoundsalarm/util"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
)

func SetupRouter() *gin.Engine {
	r := gin.Default()
	// 定义一个不转义相应内容的display模板函数
	r.SetFuncMap(template.FuncMap{
		"display": func(str string) template.HTML {
			return template.HTML(str)
		},
	})
	// 注册静态文件的使用
	r.Static("/static", "./static")

	r.LoadHTMLGlob("templates/*")
	//r.LoadHTMLFiles("templates/posts/index.html", "templates/users/index.html")
	r.GET("/index", func(c *gin.Context) {
		dataInfo, _ := util.Read()
		c.HTML(http.StatusOK, "index.html", controller.Display(dataInfo))
	})

	//获取form提交的数据
	r.POST("/input", func(ctx *gin.Context) {
		var newAlarm util.AlarmInfo
		newAlarm.Date = ctx.PostForm("alarm_time")
		newAlarm.Text = ctx.PostForm("alarm_text")
		newAlarm.Count, _ = strconv.Atoi(ctx.PostForm("alarm_count"))
		newAlarm.AlarmType = ctx.PostForm("alarm_type")
		newAlarm.Space, _ = strconv.Atoi(ctx.PostForm("alarm_space"))

		dataInfo, _ := util.Read()
		// 将提交的数据加入到数据文件中
		dataInfo.Info = append(dataInfo.Info, newAlarm)
		// 每次提交进行一次文件写操作
		err := util.Write(dataInfo)
		if err != nil {
			ctx.HTML(http.StatusOK, "index.html", err.Error())
		}
		// 渲染新的页面
		ctx.HTML(http.StatusOK, "index.html", controller.Display(dataInfo))
	})

	//获取删除form提交的数据
	r.POST("/delete", func(ctx *gin.Context) {
		id := ctx.PostForm("id")
		indexID, _ := strconv.Atoi(id)
		dataInfo, _ := util.Read()
		// 将提交的数据从数据文件中删除
		dataInfo.Info = append(dataInfo.Info[:indexID], dataInfo.Info[indexID+1:]...)
		// 每次提交进行一次文件写操作
		err := util.Write(dataInfo)
		if err != nil {
			ctx.HTML(http.StatusOK, "index.html", err.Error())
		}
		ctx.HTML(http.StatusOK, "index.html", controller.Display(dataInfo))
	})

	//获取ajax 请求的数据并返回数据
	r.POST("/alarm", func(ctx *gin.Context) {
		dataInfo, _ := util.Read()
		var resultCode []util.AlarmInfo
		// 从数据文件中判断是否有需要提醒的事件
		resultCode_timing, err := controller.GetPlayAlarm(dataInfo)
		resultCode_loop, err := controller.GetLoopAlarm(dataInfo)
		resultCode = append(resultCode, resultCode_timing...)
		resultCode = append(resultCode, resultCode_loop...)
		if err != nil {
			ctx.JSON(http.StatusOK, resultCode)
		}
		ctx.JSON(http.StatusOK, resultCode)
	})

	//获取重置 请求的数据并返回数据
	r.POST("/reset", func(ctx *gin.Context) {
		id := ctx.PostForm("id")
		indexID, _ := strconv.Atoi(id)
		dataInfo, _ := util.Read()
		dataInfo.Info[indexID].Date = time.Now().Format("2006-01-02 15:04")
		// 每次提交进行一次文件写操作
		err := util.Write(dataInfo)
		if err != nil {
			ctx.HTML(http.StatusOK, "index.html", err.Error())
		}
		ctx.HTML(http.StatusOK, "index.html", controller.Display(dataInfo))
	})

	return r
}
